﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OracleClient;
using EntitiesLayer.Entities;
using System.Data;

namespace DataLayer.DAO
{
    public class SolicitudDAO
    {
        private Connection.Connection cn;
        private OracleConnection objCn;

        public SolicitudDAO()
        {
            cn = new Connection.Connection();
            objCn = cn.Conecta();
        }

        public List<Solicitud> consultarSolicitudes(string codigo, string descripcion, string codigoEstado, string codigoUsuario, string codigoAreaUsu, string codigoAreaInv, string codigoServicio, string fechaRegistro, string codigoPresentacion)
        {
            List<Solicitud> list = new List<Solicitud>();

            using (OracleCommand cmd = new OracleCommand("BUSCARSOLICITUDES", objCn))
            {
                cmd.CommandType = CommandType.StoredProcedure;

                OracleParameter refParameter = new OracleParameter();
                refParameter.ParameterName = "RECORDSET";
                refParameter.OracleType = OracleType.Cursor;
                refParameter.Direction = ParameterDirection.Output;

                OracleParameter codigoParameter = new OracleParameter();
                codigoParameter.ParameterName = "R_COD_SOL";
                codigoParameter.OracleType = OracleType.NVarChar;
                codigoParameter.Size = 100;
                codigoParameter.Direction = ParameterDirection.Input;
                codigoParameter.Value = codigo.Trim().ToLower();

                OracleParameter descripcionParameter = new OracleParameter();
                descripcionParameter.ParameterName = "R_DES_SOL";
                descripcionParameter.OracleType = OracleType.NVarChar;
                descripcionParameter.Size = 100;
                descripcionParameter.Direction = ParameterDirection.Input;
                descripcionParameter.Value = descripcion.Trim().ToLower();

                OracleParameter estadoParameter = new OracleParameter();
                estadoParameter.ParameterName = "R_CODESTADO";
                estadoParameter.OracleType = OracleType.NVarChar;
                estadoParameter.Size = 100;
                estadoParameter.Direction = ParameterDirection.Input;
                estadoParameter.Value = codigoEstado;

                OracleParameter usuarioParameter = new OracleParameter();
                usuarioParameter.ParameterName = "R_USUARIO";
                usuarioParameter.OracleType = OracleType.NVarChar;
                usuarioParameter.Size = 100;
                usuarioParameter.Direction = ParameterDirection.Input;
                usuarioParameter.Value = codigoUsuario;

                OracleParameter areaUsuarioParameter = new OracleParameter();
                areaUsuarioParameter.ParameterName = "R_COD_AREA_USU";
                areaUsuarioParameter.OracleType = OracleType.NVarChar;
                areaUsuarioParameter.Size = 100;
                areaUsuarioParameter.Direction = ParameterDirection.Input;
                areaUsuarioParameter.Value = codigoAreaUsu;

                OracleParameter areaInvParameter = new OracleParameter();
                areaInvParameter.ParameterName = "R_COD_AREA_INV";
                areaInvParameter.OracleType = OracleType.NVarChar;
                areaInvParameter.Size = 100;
                areaInvParameter.Direction = ParameterDirection.Input;
                areaInvParameter.Value = codigoAreaInv;

                OracleParameter servicioParameter = new OracleParameter();
                servicioParameter.ParameterName = "R_COD_SERV";
                servicioParameter.OracleType = OracleType.NVarChar;
                servicioParameter.Size = 100;
                servicioParameter.Direction = ParameterDirection.Input;
                servicioParameter.Value = codigoServicio;

                OracleParameter fechaParameter = new OracleParameter();
                fechaParameter.ParameterName = "R_FECHA_REGISTRO";
                fechaParameter.OracleType = OracleType.NVarChar;
                fechaParameter.Size = 100;
                fechaParameter.Direction = ParameterDirection.Input;
                fechaParameter.Value = fechaRegistro;

                OracleParameter presentacionParameter = new OracleParameter();
                presentacionParameter.ParameterName = "R_COD_PRE";
                presentacionParameter.OracleType = OracleType.NVarChar;
                presentacionParameter.Size = 100;
                presentacionParameter.Direction = ParameterDirection.Input;
                presentacionParameter.Value = codigoPresentacion;

                cmd.Parameters.Add(refParameter);
                cmd.Parameters.Add(codigoParameter);
                cmd.Parameters.Add(descripcionParameter);
                cmd.Parameters.Add(estadoParameter);
                cmd.Parameters.Add(usuarioParameter);
                cmd.Parameters.Add(areaUsuarioParameter);
                cmd.Parameters.Add(areaInvParameter);
                cmd.Parameters.Add(servicioParameter);
                cmd.Parameters.Add(fechaParameter);
                cmd.Parameters.Add(presentacionParameter);               

                try
                {
                    objCn.Open();

                    OracleDataReader dr = cmd.ExecuteReader();

                    while (dr.Read())
                    {
                        Solicitud sol = new Solicitud();
                        sol.CodSolicitud = Convert.ToString(dr[0]);
                        sol.DesSolicitud = Convert.ToString(dr[1]);
                        sol.Usuario = Convert.ToString(dr[2]);
                        sol.FechaSolicitud = Convert.ToDateTime(dr[3]);
                        list.Add(sol);
                    }
                }
                catch (Exception ex)
                {
                    objCn.Dispose();
                }
                finally
                {
                    objCn.Close();
                }
            }
            return list;
        }

    }
}
